package br.com.conciliador.seguranca.negocio;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.FlushMode;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.conciliador.seguranca.vo.UsuarioVo;
import br.com.conciliador.util.hibernate.business.HibernateUtil;
import br.com.conciliador.util.hibernate.business.R2HbNgc;
import br.com.r2.exception.R2Exception;
import br.com.r2.util.Criptografia;
import br.com.r2.util.hibernate.business.NegocioThrow;
import br.com.r2.util.hibernate.business.RestritorHb;

@SuppressWarnings("unchecked")
public class UsuarioNgc extends R2HbNgc<UsuarioVo>
{
	private Map filtroPropriedade = new HashMap();
	private Map restritores = new HashMap();
	
	private static UsuarioNgc instancia = null;
	
	public static final int JOIN_USUARIOINCLUSAO = 1;
	public static final int JOIN_USUARIOALTERACAO = 2;
	public static final int JOIN_EST_EMPRESA = 4;
	
   private UsuarioNgc()
   {
      init(restritores, filtroPropriedade, UsuarioVo.class);
      addFiltro("login", RestritorHb.RESTRITOR_EQ, "login");
      addFiltro("flagAtivo", RestritorHb.RESTRITOR_EQ, "flagAtivo");
      addFiltro("estEmpresa.codigo", RestritorHb.RESTRITOR_EQ, "estEmpresaVo.codigo");
   }

	public static UsuarioNgc getInstancia()
	{
		if (instancia == null)
		{
			instancia = new UsuarioNgc();
		}
		return instancia;
	}
	
	@Override
	protected Map filtroPropriedade()
	{
		return filtroPropriedade;
	}

	@Override
	protected Criteria montaCriteria(Session sessao, int join)
	{
		Criteria criteria = sessao.createCriteria(UsuarioVo.class);
		if ((join & JOIN_USUARIOINCLUSAO) != 0)
		{
			criteria.createCriteria("usuarioInclusaoVo", "usuarioInclusao", Criteria.INNER_JOIN);
		}
		if ((join & JOIN_USUARIOALTERACAO) != 0)
		{
			criteria.createCriteria("usuarioAlteracaoVo", "usuarioAlteracao", Criteria.LEFT_JOIN);
		}
		if ((join & JOIN_EST_EMPRESA) != 0)
		{
		   criteria.createCriteria("estEmpresaVo", "estEmpresa", Criteria.INNER_JOIN);
		}
		return criteria;
	}

	@Override
	protected Map restritores()
	{
		return restritores;
	}

   public void alterarSenha(UsuarioVo usuarioVo) throws R2Exception
   {
      Session sessao = HibernateUtil.getInstancia().getSession();
      sessao.setFlushMode(FlushMode.COMMIT);
      Transaction tx = sessao.beginTransaction();
      try
      {
       
         this.alterarSenha(sessao, usuarioVo);
         tx.commit();
         
      }
      catch (Exception e)
      {
         throw NegocioThrow.getInstancia().catchHBEdicaoSession(e, tx);
      }
      finally
      {
         sessao.close();
      }   
   }

   private void alterarSenha(Session sessao, UsuarioVo usuarioVo) throws R2Exception
   {
      validarAlterarSenha(sessao, usuarioVo);
      
      try
      {
         UsuarioVo vo = new UsuarioVo();
         vo.setCodigo(usuarioVo.getCodigo());
         
         vo = this.get(sessao, vo, 0);
         
         String senhaCriptografada = Criptografia.criptografar(usuarioVo.getSenha());
         vo.setSenha(senhaCriptografada);
         
         sessao.merge(vo);
      }
      catch (Exception e)
      {
         throw new R2Exception("erro.encriptar.senha");
      }
   }

   private void validarAlterarSenha(Session sessao, UsuarioVo usuarioVo) throws R2Exception
   {
      if (usuarioVo == null)
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_usuario" });
      }
      if (usuarioVo.getCodigo() == null || !usuarioVo.getCodigo().isPreenchido())
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_id" });
      }
      if (usuarioVo.getSenhaAtual() == null || usuarioVo.getSenhaAtual().trim().equals(""))
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_senha_atual" });
      }
      if (usuarioVo.getSenha() == null || usuarioVo.getSenha().trim().equals(""))
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_senha" });
      }
      if (usuarioVo.getConfirmacaoSenha() == null || usuarioVo.getConfirmacaoSenha().trim().equals(""))
      {
         throw new R2Exception("campo.obrigatorio", new String[] { "lbl_confirmacao_senha" });
      }
      if (!usuarioVo.getSenha().equals(usuarioVo.getConfirmacaoSenha()))
      {
         throw new R2Exception("senha.diferente.confirmacaoSenha");
      }

      UsuarioVo vo = new UsuarioVo();
      try
      {
         vo.setCodigo(usuarioVo.getCodigo());

         vo = UsuarioNgc.getInstancia().get(sessao, vo, 0);
      }
      catch (Exception e)
      {
         throw new R2Exception(e);
      }

      String senhaCriptografada = Criptografia.criptografar(usuarioVo.getSenhaAtual());
      if (!senhaCriptografada.equals(vo.getSenha()))
      {
         throw new R2Exception("senha.incorreta");
      }
   }
}
